/** 统一相应拦截，返回给前端的统一格式; */
import {
  Injectable,
  NestInterceptor,
  CallHandler,
  ExecutionContext,
  HttpStatus,
} from '@nestjs/common'
import { Observable, map } from 'rxjs'

export interface IResposeData<T> {
  data: T
  code: number
  /**
   * 消息
   */
  message: string

  /**
   * 是否成功
   */
  success: boolean | 'ok'
}

/**
 * 分页返回数据接口
 */
export interface IResPaginated<T> {
  /**
   * 数据
   */
  data: T[]

  /**
   * 携带的元数据
   */
  meta: {
    /**
     * 当前页数
     */
    currentPage: number

    /**
     * 每页显示条目个数
     */
    itemPerPage: number

    /**
     * 总条目数
     */
    totalItems: number

    /**
     * 总页数
     */
    totalPages: number
  }
}

/**
 * 返回数据基本接口
 */
export interface IResposeBase {
  /**
   * 消息
   */
  message: string

  /**
   * 是否成功
   */
  success: boolean | 'ok'
}

/**
 * 常用返回拦截器；
 * 进行统一返回数据格式封装
 */
@Injectable()
export class CommonRespose<T> implements NestInterceptor<T, IResposeData<T>> {
  intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Observable<IResposeData<T>> {
    return next.handle().pipe(
      map((data) => ({
        data,
        code: HttpStatus.OK,
        message: '请求成功',
        success: true,
      })),
    )
  }
}

/**
 * 异样拦截器封装
 */
// @Catch()
// export class HttpExceptionFilter implements ExceptionFilter {
//   catch(exception: QueryFailedError, host: ArgumentsHost) {
//     const ctx = host.switchToHttp();
//     const response = ctx.getResponse();
//     const request = ctx.getRequest();

//     const status = exception.getStatus();
//     const exceptionRes: any = exception.getResponse();
//     const { error, message } = exceptionRes;

//     const msgLog = {
//       status,
//       message,
//       error,
//       path: request.url,
//       timestamp: new Date().toLocaleString(),
//     };

//     response.status(status).json(msgLog);
//   }
// }
